#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "bitstream.h"

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Esta função armazena e calcula o valor de uma quantidade de bits desejada.                                                               //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int get_bit(FILE *fl, unread *a, int b)
{
	int i,vezes,resto,mask=0;
	int read_bits=0;
	if(a->quant==0 || b-(a->quant)>0)       //Essa parte só é ativada se não houver bits que não foram lidos, ou seja, se a quantidade
	{                                       //de bits desejada for um mútliplo de 8, que é a quantidade de bits de um byte. Ou se a
		resto=b%8;                          //quantidade de bits desejada for maior que a quantidade de bits que não foram lidos.
		vezes=b/8;
		if((a->quant)>0) // é ativado se houver bits não lidos.
		{
			resto=(b-(a->quant))%8;
			vezes=(b-(a->quant))/8;
			read_bits=(a->unbits)<<8*vezes;
		}
		if(resto>0) // é ativado se a quantidade de bits não for um múltiplo de 8.
		{
			for(i=0;i<vezes;i++) read_bits=read_bits+(getc(fl)<<((vezes-i-1)*8));
			read_bits=read_bits<<resto;
			for(i=0;i<resto;i++) mask=(mask<<1)+1;
			mask=mask<<8-resto;
			a->unbits=getc(fl);
			read_bits=read_bits+(((a->unbits)&mask)>>(8-resto));
			mask=0;
			for(i=0;i<8-resto;i++)mask=(mask<<1)+1;
			a->unbits=(a->unbits)&mask;
			a->quant=8-resto;
		}
		else // é ativado se nenhuma condição anterior for atendida.
		{
			for(i=0;i<vezes;i++) read_bits=read_bits+(getc(fl)<<((vezes-i-1)*8));
			a->unbits=a->quant=0;
		}
	}
	else if(b<=(a->quant)) // essa parte é ativada se houver bits não lidos e se a quantidade de bits desejadas for menor
	{                      // que a de bits não lidos.
		for(i=0;i<b;i++) mask=(mask<<1)+1;
		mask=mask<<((a->quant)-b);
		read_bits=((a->unbits)&mask)>>(a->quant)-b;
		a->unbits=(a->unbits)-((a->unbits)&mask);
		a->quant=(a->quant)-b;
	}
	return read_bits;
}


